/*
    接口在开发中的作用：
        注意：类似于多态在开发中的作用，面向抽象编程
        有了接口就可以插拔，表示扩展力强，低耦合度
        接口的使用离不开多态

        任何一个接口都有调用者和实现者
        接口可以将调用者和实现者解耦合
        调用者面向接口调用                       顾客面向菜单调用
        实现者面向接口编写实现                   厨师面向菜单编写实现

    类与类之间的关系：
        is a , has a , like a
            is a：
                cat is a animal  猫是一个动物
                "继承关系"
                A extends B
            has a：
                I has a pen      我有一支笔
                "关联关系"
                关联关系通常以"属性"的形式存在
                A{
                    B b;
                }
            like a：
                cooker like a foodmenu     厨师像一个菜单一样
                "实现关系"
                实现关系通常是：类实现接口
                A implements B

    抽象类和接口的区别：
        抽象类是半抽象的，接口是完全抽象的
        抽象类有构造方法，接口中没有构造方法
        类和类之间只支持单继承，接口和接口之间支持多继承
        一个类可以同时实现多个接口，一个抽象类只能继承一个类
        接口中只允许出现常量和抽象方法

        接口用的比抽象类多，接口一般是对“行为”的抽象
 */

public class InterfaceTest03 {
    public static void main(String[] args) {
    //创建厨师对象
    FoodMenu c1 = new ChinaCooker();
    FoodMenu c2 = new AmericaCooker();
    //创建顾客对象
    Customer c = new Customer(c1);
    //顾客点菜
    c.order();
    }
}

interface FoodMenu{
    void xihongshi();
    void yuxiangrousi();
}

class Customer{
    //顾客手里有个菜单
    //has a ！！！！！，以这个出现的，表示都以属性的形式存在
    //is a！！！！！，以这个出现的，表示可以继承
    private FoodMenu foodMenu;

    //构造方法
    public Customer() {
    }
    public Customer(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }

    //set get
    public FoodMenu getFoodMenu() {
        return foodMenu;
    }
    public void setFoodMenu(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }

    //提供一个点菜的方法
    public void order(){
        FoodMenu fm = this.getFoodMenu(); //拿到菜单
        fm.xihongshi();
        fm.yuxiangrousi();
    }
}

class ChinaCooker implements FoodMenu{

    public void xihongshi() {
        System.out.println("中餐西红柿");
    }

    public void yuxiangrousi() {
        System.out.println("中餐鱼香肉丝");
    }
}

class AmericaCooker implements FoodMenu{

    public void xihongshi() {
        System.out.println("西餐西红柿");
    }

    public void yuxiangrousi() {
        System.out.println("西餐鱼香肉丝");
    }
}